from dataclasses import dataclass
from typing import Dict, List
import os
from dotenv import load_dotenv
from pathlib import Path
from typing import Dict, Any

# 加载环境变量
load_dotenv()

# 项目根目录
ROOT_DIR = Path(__file__).parent.parent

@dataclass
class ExchangeConfig:
    """交易所配置"""
    name: str
    api_key: str
    api_secret: str
    trading_pairs: List[str]
    passphrase: str = None  # 添加 passphrase 字段
    is_testnet: bool = False  # 添加 testnet 标志

@dataclass
class RiskConfig:
    """风险控制配置"""
    initial_capital: float = 10000.0  # 初始资金
    max_position_size: float = 0.3    # 最大仓位比例
    max_drawdown: float = 0.1         # 最大回撤限制
    stop_loss: float = 0.05           # 止损比例
    take_profit: float = 0.1          # 止盈比例
    max_daily_loss: float = 0.05      # 每日最大亏损限制
    position_sizing_factor: float = 0.02  # 单次开仓资金比例

@dataclass
class AnalysisConfig:
    """分析模块配置"""
    sentiment_threshold: float = 0.6    # 情绪指标阈值
    volume_threshold: float = 1000000   # 成交量阈值
    price_change_threshold: float = 0.02  # 价格变化阈值
    correlation_threshold: float = 0.7   # 相关性阈值
    ethereum_node_url: str = "https://mainnet.infura.io/v3/d7cca2a229364684812646f41aa46166"  # 以太坊节点URL
    twitter_api_key: str = os.getenv('TWITTER_API_KEY', '')  # Twitter API密钥
    twitter_api_secret: str = os.getenv('TWITTER_API_SECRET', '')  # Twitter API密钥
    twitter_access_token: str = os.getenv('TWITTER_ACCESS_TOKEN', '')  # Twitter访问令牌
    twitter_access_token_secret: str = os.getenv('TWITTER_ACCESS_TOKEN_SECRET', '')  # Twitter访问令牌密钥

# 数据配置
DATA_CONFIG = {
    'timeframe': '1h',  # 默认时间周期
    'limit': 1000,      # 获取历史数据的默认条数
    'retry_count': 3,   # 数据获取重试次数
    'retry_delay': 1,   # 重试延迟(秒)
}

# 交易所配置
EXCHANGE_CONFIG = {
    'okx': {
        'apiKey': os.getenv('OKX_API_KEY', ''),
        'secret': os.getenv('OKX_SECRET', ''),
        'password': os.getenv('OKX_PASSWORD', ''),
        'timeout': 30000,
        'enableRateLimit': True,
        'proxies': {
            'http': 'http://127.0.0.1:7890',
            'https': 'http://127.0.0.1:7890',
        },
        'options': {
            'defaultType': 'spot',
            'adjustForTimeDifference': True
        }
    }
}

# 回测配置
BACKTEST_CONFIG = {
    'initial_capital': 10000,  # 初始资金
    'commission': 0.001,       # 手续费率
    'slippage': 0.001,        # 滑点率
}

# 交易配置
TRADING_CONFIG = {
    'position_size': 0.1,      # 每次交易的仓位大小(占总资金的比例)
    'max_positions': 5,        # 最大同时持仓数
    'stop_loss': 0.02,        # 止损比例
    'take_profit': 0.05,      # 止盈比例
}

# 机器学习配置
ML_CONFIG = {
    'train_size': 0.8,        # 训练集比例
    'feature_columns': [      # 特征列
        'open', 'high', 'low', 'close', 'volume',
        'ma_5', 'ma_10', 'ma_20',
        'rsi_14', 'macd', 'macd_signal',
        'upper_band', 'middle_band', 'lower_band'
    ],
    'target_column': 'target',  # 目标列
    'prediction_horizon': 24,   # 预测时间范围(小时)
}

# 日志配置
LOG_CONFIG = {
    'level': 'INFO',
    'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    'directory': ROOT_DIR / 'logs'
}

# 可视化配置
VISUALIZATION_CONFIG = {
    'style': 'seaborn',
    'figsize': (12, 8),
    'dpi': 100
}

# 交易所配置
EXCHANGES = {
    'okx': ExchangeConfig(
        name='okx',
        api_key=os.getenv('OKX_API_KEY'),
        api_secret=os.getenv('OKX_API_SECRET'),
        trading_pairs=['BTC/USDT', 'ETH/USDT'],
        passphrase=os.getenv('OKX_PASSPHRASE'),
        is_testnet=True,  # 设置为模拟交易
    ),
    'binance': ExchangeConfig(
        name='binance',
        api_key=os.getenv('BINANCE_API_KEY'),
        api_secret=os.getenv('BINANCE_API_SECRET'),
        trading_pairs=['BTC/USDT', 'ETH/USDT']
    )
}

# 风险控制配置
RISK_CONFIG = RiskConfig()

# 分析模块配置
ANALYSIS_CONFIG = AnalysisConfig()

# 交易参数
TRADE_INTERVAL = 300  # 交易检查间隔（秒）
TIMEFRAMES = ['1m', '5m', '15m', '1h', '4h', '1d']  # 分析的时间周期

# 数据库配置
DATABASE = {
    'host': 'localhost',
    'port': 5432,
    'database': 'crypto_trading',
    'user': os.getenv('DB_USER'),
    'password': os.getenv('DB_PASSWORD')
}

def get_config() -> Dict[str, Any]:
    """获取完整配置"""
    return {
        'data': DATA_CONFIG,
        'exchange': EXCHANGE_CONFIG,
        'backtest': BACKTEST_CONFIG,
        'trading': TRADING_CONFIG,
        'ml': ML_CONFIG,
        'log': LOG_CONFIG,
        'visualization': VISUALIZATION_CONFIG
    }
